

require '地图.存档逻辑.存档装备-套装词条'

--[装备数据]
local items = {}
local pzname = {'普通','精良','史诗','传说'}
local pznamec = {'|cff00ff00精良|r','|cff00ffff精良|r','|cffff00ff史诗|r','|cffff6600传说|r'}
for _,info in ipairs(load_excel('存档数据.xlsx','存档装备')) do
    local name = ('%s-%s'):format(info['前缀'],info['名称'])
    info.tip = ("|cffff9900属性：|r|n%s'ex_tip'"):format(info['属性'])
    info['单词条几率'] = info['单词条几率'] or 0
    info['品质影响'] = info['品质影响'] or 0
    info['词条上限'] = info['词条上限'] or 0

    --解析属性
    info['属性1'] = cd_unpack_attrs(info['属性'],'data')
    info['属性2'] = cd_unpack_attrs(info['1-5级属性'],'zdata')
    info['属性3'] = cd_unpack_attrs(info['6-9级属性'],'xdata')

    items[name] = info

end


--[强化数据]
local function upgrade_item(item)
    local level = item.level or 0
    local tips = {}
    if level>0 then
        for a=1,3 do
            local key = ('zdata%s'):format(a)
            local num = item[key]
            if num then
                item[key] = num * level
            end
        end
        local tip = format_obj(item, item['1-5级属性'])
        table.insert(tips,tip)
    end
    if level>5 then
        for a=1,3 do
            local key = ('xdata%s'):format(a)
            local num = item[key]
            if num then
                item[key] = num * (level - 5)
            end
        end
        local tip = format_obj(item, item['6-9级属性'])
        table.insert(tips,tip)
    end
    item.ex_tip = ''
    if #tips>0 then
        item.ex_tip = ('|n|n|cff00ff00强化属性：|r|n%s'):format(table.concat(tips,'|n'))
    end
end

--[解析装备数据]
local public_path = {
    [[UI\存档装备图标\绿色\%s.blp]],
    [[ui\存档装备图标\蓝色\%s.blp]],
    [[ui\存档装备图标\紫色\%s.blp]],
    [[ui\存档装备图标\金色\%s.blp]],
}
local function builder_item(player,info)
    local name = info.name
    local temp = items[name]
    setmetatable(info, {__index = temp})
    local pz = info.pz
    local pname = pzname[pz]
    
    for a=1,3 do
        local key = ('data%s'):format(a)
        local num = info[key]
        if num then
            info[key] = num * (1 + temp[pname])
        end
    end
    info.title = ('%s[%s]'):format(info['名称'],pznamec[pz])
    if info.level and info.level>0 then
        info.title = ('%s +%s'):format(info.title,info.level)
    end
    if info.class~='宝石' then
        local path = public_path[info.pz] or public_path[1]
        info.art = path:format(info['名称'])
    end
    info.date = os.date(info.time or 0)
    info.qhwb = function(self)
        return ('|n|n|cff00ff00点击强化|r|n需要：强化石X%s(%s%%几率)'):format(2,20)
    end
    info['品质'] = pz
    get_cdct_tip(info)
    upgrade_item(info)
    
    return info
end

--[排序]
local sort_items = function(player)
    local order = player:get_data('存档装备-顺序') or {}
    local maps = player:get_data('存档装备-数据') or {}
    
    --顺序映射
    local info1 = {}
    local info2 = {}
    for a,id in ipairs(order) do
        local item = maps[id]
        if item then
            info1[a] = item
        end
    end

    --分类
    local infos = {}
    for _,item in pairs(info1) do
        if item then
            local class = item['部位'] or '宝石'
            if not infos[class] then
                infos[class] = {}
            end
            table.insert(infos[class],item)
        end
    end
    infos['全部'] = info1
    player:set_data('存档装备-显示',infos)
end

--通过id查找装备
function ac.player.__index:operate_item(id,func)
    local list = self:get_data('存档装备-数据') or {}
    local item = list[id]
    if item and func then
        func(item,list)
    end
    return item
end


--[取下]
ac.sync:event '同步-取下存档装备'(function(_,player,id)
    local data2 = player:get_data('存档装备-携带') or {}
    player:operate_item(id,function(item)
        if item.in_use then
            item.in_use = nil
            local class = item['部位']
            data2[class] = nil
            player:notify('玩家-刷新文本介绍',player)
            player:send_cloud('取下存档装备',id)
        end
    end)
end)

--[佩戴]
ac.sync:event '同步-佩戴存档装备'(function(_,player,id)
    local data2 = player:get_data('存档装备-携带') or {}
    player:operate_item(id,function(item)
        local class = item.class
        if class=='宝石' then
            return
        end
        local old = data2[class]
        item.in_use = true
        data2[class] = item
        if old then
            old.in_use = nil
            if old==item then
                data2[class] = nil
            end
        end
        player:notify('玩家-刷新文本介绍',player)
        player:send_cloud('佩戴存档装备',id)
    end)
end)


--[删除]
ac.sync:event '同步-分解存档装备'(function(_,player,id)
    player:operate_item(id,function(item,list)
        if item.in_use then
            return
        end
        list[id] = nil
        sort_items(player)
        player:send_cloud('分解存档装备',id)
    end)
end)

--[拖动]
ac.sync:event '同步-拖动存档装备'(function(_,player,index1,index2)
    local list = player:get_data('存档装备-数据') or {}
    local order = player:get_data('存档装备-顺序') or {}
    local idx1 = order[index1]
    local idx2 = order[index2]
    --交换位置
    order[index1],order[index2] = idx2,idx1
    sort_items(player)
    player:send_cloud('拖动存档装备',index1,index2)
end)

local dialog = nil
ac.sync:event '同步-镶嵌存档宝石'(function(_,player,id1,id2)
    if not dialog then
        dialog = ac.dialog('镶嵌宝石')
        dialog:add_button({key='取消'})
        dialog:add_button({key='确定'})
        
        function dialog:on_click(button, player)
            local id1 = player:get_data('选择-镶嵌装备')
            local id2 = player:get_data('选择-镶嵌宝石')
            dialog:hide()
            if button.key=='确定' then
                player:send_cloud('镶嵌存档宝石',id1,id2)
            end
        end
    end

    player:set_data('选择-镶嵌装备',id1)
    player:set_data('选择-镶嵌宝石',id2)
    if player:is_self() then
        dialog:show() 
    end
end)

ac.game:event '云消息-装备处理消息'(function(_,player,name,id)
    ac.game:notify('UI-处理消息',player,name,id)
end)

--[强化]
ac.sync:event '同步-开始强化宝石'(function(_,player,id)
    local item1 = player:get_data('选择-强化装备')
    if item1 then
        player:set_data('选择-强化装备',nil)
        player:send_cloud('强化存档装备',item1.id)
    end
end)

ac.game:event '云消息-移除存档装备'(function(_,player,id)
    player:operate_item(id,function(item,list)
        list[item.id] = nil
        sort_items(player)
    end)
end)

ac.game:event '云消息-获得存档装备'(function(_,player,info,id)
    local order = player:get_data('存档装备-顺序') or {}
    local data = player:get_data('存档装备-数据') or {}
    local item = builder_item(player,info)
    if id then
        order[id] = item.id
        player:notify('UI-获得存档装备',player,item)
    end
    data[item.id] = item
    sort_items(player)
    player:send_msg(('[|cff00ff00存档|r]获得 |cffffff00%s|r'):format(item.title or item.name))
end)

--[拉取]
ac.game:event '云消息-获取存档背包'(function(_,player,list1,list2,order,point)
    local maps = {}
    local info2 = {}
    --先解析
    for a,info in ipairs(list1) do
        local item = builder_item(player,info)
        maps[item.id] = item
    end
    for key,id in pairs(list2) do
        local item = maps[id]
        item.in_use = true
        info2[key] = item
    end

    player:set_data('存档装备-携带',info2)
    player:set_data('存档装备-顺序',order)
    player:set_data('存档装备-数据',maps)
    
    player:set_data('强化石',point)
    sort_items(player)

    player:notify('玩家-加载存档装备属性',player)
    player:notify('玩家-刷新文本介绍',player)
end)

--[读取属性]
ac.game:event '玩家-加载存档装备属性'(function(_,player)
    local hero = player.hero
    local data = player:get_data('存档装备-携带')
    if data and hero then
        if player:get_data('初始存档装备')==nil then
            for key,item in pairs(data) do
                load_cdsx(hero,item,'属性1')
                if item.level>0 then
                    load_cdsx(hero,item,'属性2')
                end
                if item.level>5 then
                    load_cdsx(hero,item,'属性3')
                end
            end
            player:notify('玩家-加载套装属性',player,hero)
            player:notify('玩家-加载词条属性',player,hero)
        end
    end
end)

ac.game:event '玩家-刷新文本介绍'(function(_,player)
    player:notify('玩家-刷新套装介绍',player)

    local data = player:get_data('存档装备-携带')
    local info = {}
    for key,item in pairs(data) do
        load_cdwb(info,item,'属性1')
        if item.level>0 then
            load_cdsx(info,item,'属性2')
        end
        if item.level>5 then
            load_cdsx(info,item,'属性3')
        end
    end
    for k,v in pairs(info) do
        print(k,v)
    end
    player:set_data('存档装备属性文本',atts_tip(info))
end)

ac.game:event '玩家-选择英雄完毕'(function(_,player)
    player:notify('玩家-加载存档装备属性',player)
end)

ac.game:event '游戏-获得装备存档'(function()
    ac.each_player(function(player)
        player:send_cloud('获得存档装备')
    end)
end)

ac.game:event '游戏-加载完成'(function(_,hard)
    ac.each_player(function(player)
        player:send_cloud('获取存档背包')
    end)
end)
